[][src]Crate romio

O Romio, Romio, wherefore art thou Romio?
Deny thy father and refuse thy name;
Or if thou wilt not, be but sworn my love
And I'll no longer be so synchronous.

Asynchronous networking bindings for TCP, UDP, and UDS

The types defined in this module are designed to closely follow the APIs of the analogous types in std::net. But rather than implementing synchronous traits like std::io::{Read, Write}, these types implement the asychronous versions provided by the futures-preview crate, i.e. futures::io::{AsyncRead, AsyncWrite}. When using async/await syntax, the experience should be quite similar to traditional blocking code that uses std::net.

Because futures-preview is currently unstable, this crate requires nightly Rust.

Examples

TCP Server

use romio::tcp::{TcpListener, TcpStream};
use futures::prelude::*;

async fn say_hello(mut stream: TcpStream) {
    stream.write_all(b"Shall I hear more, or shall I speak at this?").await;
}

async fn listen() -> Result<(), Box<dyn std::error::Error + 'static>> {
    let socket_addr = "127.0.0.1:8080".parse()?;
    let mut listener = TcpListener::bind(&socket_addr)?;
    let mut incoming = listener.incoming();

    // accept connections and process them serially
    while let Some(stream) = incoming.next().await {
        say_hello(stream?).await;
    }
    Ok(())
}

TCP Client

use std::error::Error;
use futures::prelude::*;
use romio::tcp::{TcpListener, TcpStream};

async fn receive_sonnet() -> Result<(), Box<dyn Error + 'static>> {
    let socket_addr = "127.0.0.1:8080".parse()?;
    let mut buffer = vec![];
    let mut stream = TcpStream::connect(&socket_addr).await?;

    stream.read(&mut buffer).await?;
    println!("{:?}", buffer);
    Ok(())
}

Modules

raw

Raw poll APIs

tcp

Async TCP bindings.

udp

Async UDP bindings.

uds

Async UDS (Unix Domain Sockets) bindings.

Structs

TcpListener

A TCP socket server, listening for connections.

TcpStream

A TCP stream between a local and a remote socket.

UdpSocket

A UDP socket.